package storage

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
)

// LocalStorage 本地文件存储实现
type LocalStorage struct {
	basePath string
	baseURL  string
}

// NewLocalStorage 创建本地存储实例
func NewLocalStorage(config Config) *LocalStorage {
	return &LocalStorage{
		basePath: config.LocalBasePath,
		baseURL:  config.LocalBaseURL,
	}
}

// SaveFile 保存文件到本地
func (s *LocalStorage) SaveFile(data io.Reader, filename string, contentType string) (string, error) {
	fullPath := filepath.Join(s.basePath, filename)

	// 确保目录存在
	dir := filepath.Dir(fullPath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return "", fmt.Errorf("创建目录失败: %v", err)
	}

	// 创建文件
	file, err := os.Create(fullPath)
	if err != nil {
		return "", fmt.Errorf("创建文件失败: %v", err)
	}
	defer file.Close()

	// 写入数据
	if _, err := io.Copy(file, data); err != nil {
		return "", fmt.Errorf("写入文件失败: %v", err)
	}

	return s.GetFileURL(filename), nil
}

// GetFile 从本地读取文件
func (s *LocalStorage) GetFile(filename string) (io.ReadCloser, error) {
	fullPath := filepath.Join(s.basePath, filename)
	return os.Open(fullPath)
}

// DeleteFile 删除本地文件
func (s *LocalStorage) DeleteFile(filename string) error {
	fullPath := filepath.Join(s.basePath, filename)
	return os.Remove(fullPath)
}

// GetFileURL 获取文件访问URL
func (s *LocalStorage) GetFileURL(filename string) string {
	return fmt.Sprintf("%s/%s", s.baseURL, filename)
}

// FileExists 检查文件是否存在
func (s *LocalStorage) FileExists(filename string) (bool, error) {
	fullPath := filepath.Join(s.basePath, filename)
	_, err := os.Stat(fullPath)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}
